﻿# -*- coding: utf-8 -*-
'''eof
name:EN_模块
code:HQDEN_score
tableName:
columnName:
groups:EN
dependencies:BBD_Macro
type:常用指标
datasourceType:在线指标
description:
eof'''

import math
import pandas as pd
import numpy as np
import json



def func(x, start1, end1, start2, end2):
    if x is np.nan:
        return np.nan
    else:
        r1 = (x - start1) / (end1 - start1)
        r2 = r1 * (end2 - start2) + start2
        return r2


def isfloat(x):
    '''
    判断x为float类型且大于等于0
    :param x:
    :return:
    '''
    try:
        if isinstance(float(x), float) and float(x)>=0:
            if str(x) in ['inf', 'infinity', 'INF', 'INFINITY', 'True']:
                return False
            else:
                return True
        else:
            return False
    except:
        return False

def value(x):
     null_type_list = ['', ' ', None, 'null', 'Null', 'NULL', '/', '-', '--']
     if  isfloat(x)==True and x not in null_type_list:
         return float(x)
     else:
         return 0



#value=[-np.inf, 8, 8.5, 9, 10.5,np.inf,]

#score=[0,0, 50, 80, 100,100]

def score_mapping(x,value,score):
    #指标值上下限
    value_down=value[0:-1]
    value_up=value[1:]
    #得分上下限
    score_down= score[0:-1]
    score_up= score[1:]
    for a,b,c,d in zip(value_up,value_down,score_up,score_down):
        #plutus配置指标得分规则为左开右闭
        if x <=a and x >b:
            if c==d:
                return c
            else:
                return func(x,b,a,d,c)




def EN_score():
    try:
        data = BBD_Macro
        #该语句用于配置
        # data=context['content']
        # data=content

        #该语句用于自测
        null_type_list = ['', ' ', None, 'null', 'Null', 'NULL', '/', '-', '--']
        if data in null_type_list:
            return u"缺失值"
        else:
            #M2同比增速3月平均
            try:
                m20=data[u'EN1003']
                if m20 in null_type_list:
                    m2= 13.5
                else:
                    m2= value(m20)
            except:
                #等缺失值阈值明确后调整
                m2=8

            try:
            #固定资产投资完成额累计增速3月平均
                gdzc0=data[u'EN503']
                if gdzc0 in null_type_list:
                    gdzc=20
                else:
                    gdzc=value(gdzc0)
            except:
                gdzc=5
            try:
            #国家财政支出累计增长12月平均
                gjcz0=data[u'EN812']
                if gjcz0 in null_type_list:
                    gjcz=16
                else:
                    gjcz=value(gjcz0)
            except:
                gjcz=7.5

            try:
            #社会消费品销售零售总额同比增速6月平均
                shxfp0=data[u'EN706']
                if shxfp0 in null_type_list:
                    shxfp=13.5
                else:
                    shxfp=value(shxfp0)
            except:
                shxfp=8.5

            try:
                #国房景气指数12月平均
                gfjq0=data[u'EN1212']
                if gfjq0 in null_type_list:
                    gfjq=97.5
                else:
                    gfjq=value(gfjq0)
            except:
                gfjq=93
            try:
                #采购经理指数12月平均(制造业）
                cgjl0=data[u'EN112']
                if cgjl0 in null_type_list:
                    cgjl=49.067
                else:
                    cgjl=value(cgjl0)
            except:
                cgjl=45

            try:
                #重庆企业所在地人均GDP
                CQGDP0=data[u'EnPerCapitaGDP']
                if CQGDP0 in null_type_list:
                    CQGDP=50000
                else:
                    CQGDP=value(CQGDP0)
            except:
                CQGDP=9500

            try:
                #企业所在地人均GDP年增长率(地区)
                CQGDPgrow0=data[u'EnPerCapitaGDPIncRate']
                if CQGDPgrow0 in null_type_list:
                    CQGDPgrow=0.12
                else:
                    CQGDPgrow=value(CQGDPgrow0)
            except:
                CQGDPgrow=0.03




                #固定资产投资完成额累计增速3月平均index
            gdzc_index=[-np.inf,5.0000,7.5000,20.0000,27.5000,33.5000,np.inf]
        #固定资产投资完成额累计增速3月平均score
            gdzc_score=[25,25,40,50,60,75,75]
            #M2同比增速3月平均index
            m2_index=[-np.inf,8.0000,9.15,13.500,22.5000,30.000,np.inf]
            #M2同比增速12月平均score
            m2_score=[25,25,40,50,60,75,75]
                #国家财政支出累计增长12月平均index
            gjcz_index=[-np.inf,7.5000,9.5000,16.0000,29.0000,32.5000,np.inf]
        #国家财政支出累计增长12月平均score
            gjcz_score=[25,25,40,50,60,75,75]
            #社会消费品销售零售总额同比增速6月平均index
            shxfp_index=[-np.inf,8.5000,10.5000,13.5000,18.5000,23.0000,np.inf]
        #社会消费品销售零售总额同比增速6月平均socre
            shxfp_score=[25,25,40,50,60,75,75]
                    #国房景气指数12月平均index
            gfjq_index=[-np.inf,93.0000, 93.8000, 97.5000, 103.0000, 104.5000,np.inf]
            #国房景气指数12月平均score
            gfjq_score=[25,25,40,50,60,75,75]
                    #采购经理指数12月平均(制造业）index
            cgjl_index=[-np.inf,45.0000,50.0000,50.8000,53.5000,55.0000,np.inf]
            #采购经理指数12月平均(制造业）score
            cgjl_score=[0,0,30,50,75,100,100]
                    #重庆企业所在地人均GDPindex
            CQGDP_index=[-np.inf,9500,35000,50000,68000,100000,np.inf]
            #重庆企业所在地人均GDPscore
            CQGDP_score=[25,25,40,50,60,75,75]
                #企业所在地人均GDP年增长率(地区)index
            CQGDPgrow_index=[-np.inf,0.03,0.09,0.12,0.23,0.255,np.inf]
            #企业所在地人均GDP年增长率(地区)score
            CQGDPgrow_score=[25,25,40,50,60,75,75]





            #指标值
            m2_s=score_mapping(m2,m2_index,m2_score)
            gdzc_s=score_mapping(gdzc,gdzc_index,gdzc_score)
            gjcz_s=score_mapping(gjcz,gjcz_index,gjcz_score)
            shxfp_s=score_mapping(shxfp,shxfp_index,shxfp_score)
            gfjq_s	=score_mapping(gfjq,gfjq_index,gfjq_score)
            cgjl_s	=score_mapping(cgjl,cgjl_index,cgjl_score)
            CQGDP_s=score_mapping(CQGDP,CQGDP_index,CQGDP_score)
            CQGDPgrow_s=score_mapping(CQGDPgrow,CQGDPgrow_index,CQGDPgrow_score)
            #模块得分
            EN_Score = m2_s*0.0186+gdzc_s*0.1409+gjcz_s*0.2596+shxfp_s*0.1963+gfjq_s*0.0335+cgjl_s*0.3216+CQGDP_s*0.0097+CQGDPgrow_s*0.0216
            return EN_Score
    except:

        return u"缺失值"

result = EN_score()






